home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / progjour / 1991 / 01 / order.awk < prev    next >
Text File  |  1990-12-05  |  3KB  |  102 lines

  1. #
  2. # ORDER.AWK -- "Order is a program that renumbers the local
  3. #               labels in assembly language procedures."
  4. # After John Otken, "Manipulating Large Data"
  5. #   in Programmer's Journal, March/April 1990.
  6. #
  7. # Bill Huber, 7/18/90: Written as a filter.  Diagnostics go to errlog
  8. #
  9. BEGIN {
  10.     MARKER = "\0377"        # An ASCII string not appearing in any PROC
  11.     errlog = "ORDER.ERR"    # Diagnostics file
  12. }
  13. #----------------------------------------------------------------------#
  14.  
  15. $2 ~   /^(P|p)(R|r)(O|o)(C|c)$/ &&
  16. $1 !~  /^;/ {
  17.     print
  18.     print NR ":\t" $1 > errlog
  19.     altered_proc += process_procedure($1)
  20.     }
  21. #----------------------------------------------------------------------#
  22.  
  23.     {
  24.     print
  25.     }
  26. #----------------------------------------------------------------------#
  27.  
  28. END {
  29.     if (altered_proc == 0) altered_proc = "No"
  30.     if (altered_proc != 1) plural = "s"
  31.  
  32.     print > errlog
  33.     print altered_proc " procedure" plural " resequenced.">errlog
  34.     }
  35. #----------------------------------------------------------------------#
  36.  
  37. function process_procedure(proc_name, local_line, resequenced) {
  38.  
  39.     #    Returns 0 if nothing is changed, 1 otherwise.
  40.     #
  41.     local_line  = 0
  42.     resequenced = 0
  43.  
  44.     #
  45.     #    Read the procedure into memory (lines[]).
  46.     #    Create a list of three-letter labels (labels[]).
  47.     #
  48.     while (getline > 0 &&
  49.         !($2 ~ /^(E|e)(N|n)(D|d)(P|p)$/ && $1 !~ /^;/ {
  50.  
  51.         lines[local_line++] = $0
  52.  
  53.         if ($1 ~ /^[A-Za-z][A-Za-z][A-Za-z][0-9][0-9]*:$/) {
  54.             label  = substr($1, 1, index($1, ":")-1)
  55.             prefix = substr(label, 1, 3)
  56.  
  57.             if (label in labels) {
  58.                 print NR ":\t*** Repeated local label " \
  59.                     label > errlog
  60.             }    else {
  61.                 indexes[prefix]++
  62.                 if (indexes[prefix] != substr(label, 4))
  63.                     resequenced = 1
  64.             }
  65.  
  66.             labels[label] = prefix indexes[prefix]
  67.             print NR ":\t\t" label " --> " labels[label] > errlog
  68.         }
  69.     }
  70.  
  71.     if ($1 != procname)
  72.         print NR ":\t\t*** EOF or ENDP before end of procedure " \
  73.             procname > errlog
  74.     else
  75.         print NR ":\t\tENDP" > errlog
  76.  
  77.     #
  78.     #    Resequence local labels from labels[] as the procedure is
  79.     #    copied to output.  This can be speeded up considerably
  80.     #    with some optimization.
  81.     #    MARKER is a kludge to make the code simple.
  82.     #
  83.     for (i=0; i<local_line; i++) {
  84.         for (label in labels) {
  85.             if (match(lines[i], label)) {
  86.                 sub(label ":", MARKER labels[label] ":", lines[i])
  87.                 gsub(" " label, " " MARKER labels[label], lines[i])
  88.                 gsub("," label, "," MARKER labels[label], lines[i])
  89.                 gsub(MARKER, "", lines[i])    # Remove MARKERs
  90.             }
  91.         }
  92.         print lines[i]
  93.     }
  94.  
  95.     delete lines
  96.     delete labels
  97.     delete indexes
  98.  
  99.     return resequenced
  100. } # process_procedure()
  101. # end of ORDER.AWK #
  102.